package 设计一个验证系统;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @Program:IntelliJ IDEA
 * @description:
 * @author:香蕉你个啵娜娜 l.h-p@qq.com
 * @create:2023-02-09 09:14
 **/

public class AuthenticationManager {
    private int timeToLive;
    // 存储id的最后一次更新的时间
    private final HashMap<String, Integer> map = new HashMap<>();
    // 使用两个列表分别存储所有记录的id和time
    List<String> idList = new ArrayList<>();
    List<Integer> timeList = new ArrayList<>();
    // 表示上一次查询未过时验证码时，第一个未过时的验证码
    int start = 0;

    public AuthenticationManager(int timeToLive) {
        this.timeToLive = timeToLive;
    }

    public void generate(String tokenId, int currrentTime) {
        map.put(tokenId, currrentTime);
        idList.add(tokenId);
        timeList.add(currrentTime);
    }

    public void renew(String tokenId, int currentTime){
        if (map.containsKey(tokenId)) {
            if (map.get(tokenId) > currentTime - timeToLive) {
                map.put(tokenId, currentTime);
                idList.add(tokenId);
                timeList.add(currentTime);
            }
        }
    }

    public int countUnexpiredTokens(int currentTime) {
        int n = idList.size();
        int i = start;
        for (; i < n; i++) {
            String id = idList.get(i);
            Integer time = timeList.get(i);
            // 遇到没超时的记录就停止遍历
            if (time > currentTime - timeToLive) break;
            // 如果这一id的最后一次更新时间和该次记录的时间相同，则说明这一id已过时
            if (map.get(id).equals(time)) {
                map.remove(id);
            }
        }
        start = i;
        return map.size();
    }

}
